﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using Learun.Util;

namespace Learun.DataBase.Repository
{
    public interface IRepository
    {
        DbConnection getDbConnection();

        IRepository BeginTrans();

        void Commit();

        void Rollback();

        int ExecuteBySql(string strSql);

        int ExecuteBySql(string strSql, object dbParameter);

        int ExecuteByProc(string procName);

        int ExecuteByProc(string procName, object dbParameter);

        T ExecuteByProc<T>(string procName) where T : class;

        T ExecuteByProc<T>(string procName, object dbParameter) where T : class;

        IEnumerable<T> QueryByProc<T>(string procName) where T : class;

        IEnumerable<T> QueryByProc<T>(string procName, object dbParameter) where T : class;

        int Insert<T>(T entity) where T : class;

        /// <summary>
        /// 仓储下的方法。可以动态的根据第一个参数的T，来插入对应的表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="tablename"></param>
        /// <returns></returns>
        int InsertByNoMap<T>(T entity, string tablename) where T : class;
        /// <summary>
        /// 仓储下的方法。可以动态的根据第一个参数的T，来插入对应的表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="tablename"></param>
        /// <returns></returns>
        int InsertByNoMap<T>(List<T> entities, string tablename) where T : class;

        int Insert<T>(List<T> entity) where T : class;

        int Delete<T>(T entity) where T : class;

        int Delete<T>(List<T> entity) where T : class;

        int Delete<T>(Expression<Func<T, bool>> condition) where T : class, new();

        int Update<T>(T entity) where T : class;
        /// <summary>
        /// 仓储下的方法。可以动态的根据第一个参数的T，来更新对应的表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="tablename"></param>
        /// <returns></returns>
        int UpdateByNoMap<T>(T entity, string tablename, string pkcolumn) where T : class;
        /// <summary>
        /// 仓储下的方法。可以动态的根据第一个参数的T，来更新对应的表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="tablename"></param>
        /// <returns></returns>
        int UpdateByNoMap<T>(List<T> entities, string tablename, string pkcolumn) where T : class;
        int UpdateEx<T>(T entity) where T : class;

        int Update<T>(List<T> entity) where T : class;
        /// <summary>
        /// 仓储下的方法。根据主键值查找某一个实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="keyValue"></param>
        /// <returns></returns>
        T FindEntity<T>(object keyValue) where T : class;

        T FindEntity<T>(Expression<Func<T, bool>> condition) where T : class, new();

        /// <summary>
        /// 仓储下的方法。根据sql查找某一个实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="strSql"></param>
        /// <param name="dbParameter">new { account = account }，类似这样。会替换sql中@account的字眼</param>
        /// <returns></returns>
        T FindEntity<T>(string strSql, object dbParameter) where T : class, new();

        IQueryable<T> IQueryable<T>() where T : class, new();

        IQueryable<T> IQueryable<T>(Expression<Func<T, bool>> condition) where T : class, new();

        IEnumerable<T> FindList<T>() where T : class, new();
        /// <summary>
        /// 仓储下的方法。根据sql查找集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="strSql"></param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(string strSql) where T : class;
        /// <summary>
        /// 仓储下的方法。根据sql查找集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="strSql"></param>
        /// <param name="dbParameter">参数，到时候sql里的@xxx会被xxx替换。new { TemplateFileID = keyValue }</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(string strSql, object dbParameter) where T : class;

        IEnumerable<T> FindList<T>(Pagination pagination) where T : class, new();

        IEnumerable<T> FindList<T>(Expression<Func<T, bool>> condition, Pagination pagination) where T : class, new();

        IEnumerable<T> FindList<T>(Expression<Func<T, bool>> condition) where T : class, new();

        IEnumerable<T> FindList<T>(string strSql, Pagination pagination) where T : class;
        /// <summary>
        /// 仓储下的方法。根据sql查找集合。并进行分页
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="strSql"></param>
        /// <param name="dbParameter"></param>
        /// <param name="pagination">分页对象。包括每页多少 排序方式等</param>
        /// <returns></returns>
        IEnumerable<T> FindList<T>(string strSql, object dbParameter, Pagination pagination) where T : class;

        DataTable FindTable(string strSql);

        DataTable FindTable(string strSql, object dbParameter);

        DataTable FindTable(string strSql, Pagination pagination);

        DataTable FindTable(string strSql, object dbParameter, Pagination pagination);

        object FindObject(string strSql);

        object FindObject(string strSql, object dbParameter);

        IEnumerable<T> GetDBTable<T>() where T : class, new();

        IEnumerable<T> GetDBTableFields<T>(string tableName) where T : class, new();
    }
}
